import json
import re
from django_redis import get_redis_connection

from django.shortcuts import render
from django.http import JsonResponse
from django.views import View
from users.models import User


# Create your views here.
class UsernameCountView(View):

    def get(self, request, username):
        """
        检查用户名是否已经存在
        :param request:
        :param username:
        :return:
        """
        try:
            count = User.objects.filter(username=username).count()

        except Exception as err:
            return JsonResponse({
                'code': 400,
                'errmsg': '访问数据库失败'
            })

        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'count': count
        })


class MobileCountView(View):

    def get(self, request, mobile):
        """
        检查手机号是否已经存在
        :param request:
        :param mobile:
        :return:
        """

        # 查询参数mobile 在mysql中的存在数量
        try:
            count = User.objects.filter(mobile.mobile).count()
        # 报错处理
        except Exception as e:
            return JsonResponse({
                'code': 400,
                'errmsg': '数据库查询错误'
            })
        # 返回查询结果
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'count': count
        })


# 注册接口
# 选项	方案
# 请求方法	POST
# 请求地址	register/
# 参数需要确认
# 参数名	    类型	    是否必传	说明
# username	string	是	    用户名
# password	string	是	    密码
# password2	string	是	    确认密码
# mobile	string	是	    手机号
# sms_code	string	是	    短信验证码
# allow	    bool	    是	    是否同意用户协议

class RegisterView(View):
    def post(self, request):
        """接收表单数据"""
        # 接收数据
        rq_dict = json.loads(request.body)
        username = rq_dict.get('username')
        password = rq_dict.get('password')
        password2 = rq_dict.get('password2')
        mobile = rq_dict.get('mobile')
        allow = rq_dict.get('allow')
        sms_code_client = rq_dict.get('sms_code')

        # 进行整体校验
        if not all([username, password, password2, mobile, allow, sms_code_client]):
            return JsonResponse({
                'code': 400,
                'errmsg': '缺少必要参数'
            })

        # 用户名校验
        if not re.match(r'[a-zA-Z0-9_-]{5,20}$', username):
            return JsonResponse({
                'code': 400,
                'errmsg': '用户名格式有误'
            })

        # 密码校验
        if not re.match(r'[a-zA-Z0-9]{8,20}$', password):
            return JsonResponse({
                'code': 400,
                'errmsg': '密码格式有误'
            })

        # 二次输入密码和一次输入密码比对
        if password != password2:
            return JsonResponse({
                'code': 400,
                'errmsg': '两次密码输入不一致，请重新输入'
            })

        # 电话校验
        if not re.match(r'1[3-9]\d{9}$', mobile):
            return JsonResponse({
                'code': 400,
                'errmsg': '手机号码格式有误'
            })

        # 用户协议勾选校验
        if not allow:
            return JsonResponse({
                'code': 400,
                'errmsg': '尚未勾选用户协议'
            })

        # 链接redis
        redis_conn = get_redis_connection('verify_code')
        # 从redis中获取sms_code
        sms_code_server = redis_conn.get('sms_%s' % mobile)

        if not sms_code_server:
            return JsonResponse({
                'code': 400,
                'errmsg': '短信验证码过期'
            })

        if sms_code_client != sms_code_server.decode():
            return JsonResponse({
                'code': 400,
                'errmsg': '验证码错误'
            })
        # 保存用户名 username、密码 password、手机号码 mobile 数据进数据库
        try:
            user = User.objects.create_user(
                username=username,
                password=password,
                mobile=mobile
            )
        except Exception as err:
            return JsonResponse({
                'code': 400,
                'errmsg': '保存失败'
            })

        return JsonResponse({
            'code': 0,
            'errmsg': 'OK'
        })
